package org.aynu.orderservice.service;

import com.baomidou.mybatisplus.extension.service.IService;
import org.aynu.orderservice.common.OrderResponse;
import org.aynu.orderservice.entity.OrderEntity;
import org.aynu.orderservice.entity.OrderItemsEntity;

import java.util.List;
import java.util.Map;

/**
 * 订购服务
 *
 * @author 小粥
 * @since 2025/03/03
 */

public interface OrderService extends IService<OrderEntity> {

    /**
     * 创建订单
     *
     * @param orderEntity        Order 实体
     * @param orderItemsEntities Order Items 实体
     * @param cartId             购物车 ID
     * @return {@link OrderResponse }<{@link Integer }>
     * @author 小粥
     * @since 2025/03/03
     */

    OrderResponse<Integer> createOrder(OrderEntity orderEntity, List<OrderItemsEntity> orderItemsEntities, Integer cartId);

    /**
     * 直接创建订单
     *
     * @param orderEntity        Order 实体
     * @param orderItemsEntities Order Items 实体
     * @return {@link OrderResponse }<{@link Integer }>
     * @author 小粥
     * @since 2025/03/03
     */

    OrderResponse<Integer> directCreateOrder(OrderEntity orderEntity, List<OrderItemsEntity> orderItemsEntities);

    /**
     * 按用户 ID 选择订单
     *
     * @param userId 用户 ID
     * @return {@link OrderResponse }<{@link List }<{@link Map }<{@link String }, {@link Object }>>>
     * @author 小粥
     * @since 2025/03/03
     */

    OrderResponse<List<Map<String, Object>>> selectOrdersByUserId(Integer userId);

    /**
     * 选择 Order by ID （按 ID 排序）
     *
     * @param orderId 订单 ID
     * @return {@link OrderResponse }<{@link Map }<{@link String }, {@link Object }>>
     * @author 小粥
     * @since 2025/03/03
     */

    OrderResponse<Map<String, Object>> selectOrderById(Integer orderId);

    /**
     * 更新订单状态
     *
     * @param orderId 订单 ID
     * @param status  地位
     * @return {@link OrderResponse }<{@link Integer }>
     * @author 小粥
     * @since 2025/03/03
     */

    OrderResponse<Integer> updateOrderStatus(Integer orderId, String status);

    /**
     * 按用户取消订单
     *
     * @param orderId 订单 ID
     * @param userId  用户 ID
     * @return {@link OrderResponse }<{@link Integer }>
     * @author 小粥
     * @since 2025/03/03
     */

    OrderResponse<Integer> cancelOrderByUser(Integer orderId, Integer userId);

    /**
     * 按系统取消订单
     *
     * @param orderId 订单 ID
     * @return {@link OrderResponse }<{@link Integer }>
     * @author 小粥
     * @since 2025/03/03
     */

    OrderResponse<Integer> cancelOrderBySystem(Integer orderId);
}